package com.lfg.leetcode.leetcode200;

//https://www.cnblogs.com/grandyang/p/4629032.html
//https://blog.csdn.net/Jeff_Winger/article/details/82694815
public class No233countDigitOne {

    public static void main(String[] args) {
        int ret = countDigitOne(13);
        System.out.println(ret);
    }


    //计算1在第i位上出现的次数。
    //分三种情况：1.第i位值为0，此时i不会为首位。例如120345，计算第三位（i=2）出现1的次数为12* 1000， 前两位为0-11，
    //后三位为000-999。 如果i在末位，乘以1，否则乘以10^后边位数
    //         2.第i位值为1，例如321456，i=2， 出现1的次数为32 * 1000 + (456 + 1), 前一项中前两位0 - 31，
    //           后四位00-999， 后一项前三位 321，后三位 000-456. 如果出现在首位，系数为0（取代32），出现在
    //           末位，补数位0（456 + 1）
    //         3.第i位值大于1，例如 123456， i=2, 值为（12 + 1）* 1000， 前三位 0-12， 后三位0-999
    //           i在首位，系数为1

    public static int countDigitOne(int n) {
        int count = 0;
        int left = n;
        int b = 1;
        while (left > 0) {
            int num = left % 10;
            left /= 10;
            count += left * b;
            if (num == 1) {
                count += 1 + n % b;
            } else if (num > 1) {
                count += b;
            }
            b *= 10;
        }
        return count;
    }
}
